default rel
%define XMMWORD
%define YMMWORD
%define ZMMWORD
section .text code align=64


global  x25519_fe51_mul

ALIGN   32
x25519_fe51_mul:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe51_mul:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8



        push    rbp

        push    rbx

        push    r12

        push    r13

        push    r14

        push    r15

        lea     rsp,[((-40))+rsp]

$L$fe51_mul_body:

        mov     rax,QWORD[rsi]
        mov     r11,QWORD[rdx]
        mov     r12,QWORD[8+rdx]
        mov     r13,QWORD[16+rdx]
        mov     rbp,QWORD[24+rdx]
        mov     r14,QWORD[32+rdx]

        mov     QWORD[32+rsp],rdi
        mov     rdi,rax
        mul     r11
        mov     QWORD[rsp],r11
        mov     rbx,rax
        mov     rax,rdi
        mov     rcx,rdx
        mul     r12
        mov     QWORD[8+rsp],r12
        mov     r8,rax
        mov     rax,rdi
        lea     r15,[r14*8+r14]
        mov     r9,rdx
        mul     r13
        mov     QWORD[16+rsp],r13
        mov     r10,rax
        mov     rax,rdi
        lea     rdi,[r15*2+r14]
        mov     r11,rdx
        mul     rbp
        mov     r12,rax
        mov     rax,QWORD[rsi]
        mov     r13,rdx
        mul     r14
        mov     r14,rax
        mov     rax,QWORD[8+rsi]
        mov     r15,rdx

        mul     rdi
        add     rbx,rax
        mov     rax,QWORD[16+rsi]
        adc     rcx,rdx
        mul     rdi
        add     r8,rax
        mov     rax,QWORD[24+rsi]
        adc     r9,rdx
        mul     rdi
        add     r10,rax
        mov     rax,QWORD[32+rsi]
        adc     r11,rdx
        mul     rdi
        imul    rdi,rbp,19
        add     r12,rax
        mov     rax,QWORD[8+rsi]
        adc     r13,rdx
        mul     rbp
        mov     rbp,QWORD[16+rsp]
        add     r14,rax
        mov     rax,QWORD[16+rsi]
        adc     r15,rdx

        mul     rdi
        add     rbx,rax
        mov     rax,QWORD[24+rsi]
        adc     rcx,rdx
        mul     rdi
        add     r8,rax
        mov     rax,QWORD[32+rsi]
        adc     r9,rdx
        mul     rdi
        imul    rdi,rbp,19
        add     r10,rax
        mov     rax,QWORD[8+rsi]
        adc     r11,rdx
        mul     rbp
        add     r12,rax
        mov     rax,QWORD[16+rsi]
        adc     r13,rdx
        mul     rbp
        mov     rbp,QWORD[8+rsp]
        add     r14,rax
        mov     rax,QWORD[24+rsi]
        adc     r15,rdx

        mul     rdi
        add     rbx,rax
        mov     rax,QWORD[32+rsi]
        adc     rcx,rdx
        mul     rdi
        add     r8,rax
        mov     rax,QWORD[8+rsi]
        adc     r9,rdx
        mul     rbp
        imul    rdi,rbp,19
        add     r10,rax
        mov     rax,QWORD[16+rsi]
        adc     r11,rdx
        mul     rbp
        add     r12,rax
        mov     rax,QWORD[24+rsi]
        adc     r13,rdx
        mul     rbp
        mov     rbp,QWORD[rsp]
        add     r14,rax
        mov     rax,QWORD[32+rsi]
        adc     r15,rdx

        mul     rdi
        add     rbx,rax
        mov     rax,QWORD[8+rsi]
        adc     rcx,rdx
        mul     rbp
        add     r8,rax
        mov     rax,QWORD[16+rsi]
        adc     r9,rdx
        mul     rbp
        add     r10,rax
        mov     rax,QWORD[24+rsi]
        adc     r11,rdx
        mul     rbp
        add     r12,rax
        mov     rax,QWORD[32+rsi]
        adc     r13,rdx
        mul     rbp
        add     r14,rax
        adc     r15,rdx

        mov     rdi,QWORD[32+rsp]
        jmp     NEAR $L$reduce51
$L$fe51_mul_epilogue:

$L$SEH_end_x25519_fe51_mul:

global  x25519_fe51_sqr

ALIGN   32
x25519_fe51_sqr:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe51_sqr:
        mov     rdi,rcx
        mov     rsi,rdx



        push    rbp

        push    rbx

        push    r12

        push    r13

        push    r14

        push    r15

        lea     rsp,[((-40))+rsp]

$L$fe51_sqr_body:

        mov     rax,QWORD[rsi]
        mov     r15,QWORD[16+rsi]
        mov     rbp,QWORD[32+rsi]

        mov     QWORD[32+rsp],rdi
        lea     r14,[rax*1+rax]
        mul     rax
        mov     rbx,rax
        mov     rax,QWORD[8+rsi]
        mov     rcx,rdx
        mul     r14
        mov     r8,rax
        mov     rax,r15
        mov     QWORD[rsp],r15
        mov     r9,rdx
        mul     r14
        mov     r10,rax
        mov     rax,QWORD[24+rsi]
        mov     r11,rdx
        imul    rdi,rbp,19
        mul     r14
        mov     r12,rax
        mov     rax,rbp
        mov     r13,rdx
        mul     r14
        mov     r14,rax
        mov     rax,rbp
        mov     r15,rdx

        mul     rdi
        add     r12,rax
        mov     rax,QWORD[8+rsi]
        adc     r13,rdx

        mov     rsi,QWORD[24+rsi]
        lea     rbp,[rax*1+rax]
        mul     rax
        add     r10,rax
        mov     rax,QWORD[rsp]
        adc     r11,rdx
        mul     rbp
        add     r12,rax
        mov     rax,rbp
        adc     r13,rdx
        mul     rsi
        add     r14,rax
        mov     rax,rbp
        adc     r15,rdx
        imul    rbp,rsi,19
        mul     rdi
        add     rbx,rax
        lea     rax,[rsi*1+rsi]
        adc     rcx,rdx

        mul     rdi
        add     r10,rax
        mov     rax,rsi
        adc     r11,rdx
        mul     rbp
        add     r8,rax
        mov     rax,QWORD[rsp]
        adc     r9,rdx

        lea     rsi,[rax*1+rax]
        mul     rax
        add     r14,rax
        mov     rax,rbp
        adc     r15,rdx
        mul     rsi
        add     rbx,rax
        mov     rax,rsi
        adc     rcx,rdx
        mul     rdi
        add     r8,rax
        adc     r9,rdx

        mov     rdi,QWORD[32+rsp]
        jmp     NEAR $L$reduce51

ALIGN   32
$L$reduce51:
        mov     rbp,0x7ffffffffffff

        mov     rdx,r10
        shr     r10,51
        shl     r11,13
        and     rdx,rbp
        or      r11,r10
        add     r12,r11
        adc     r13,0

        mov     rax,rbx
        shr     rbx,51
        shl     rcx,13
        and     rax,rbp
        or      rcx,rbx
        add     r8,rcx
        adc     r9,0

        mov     rbx,r12
        shr     r12,51
        shl     r13,13
        and     rbx,rbp
        or      r13,r12
        add     r14,r13
        adc     r15,0

        mov     rcx,r8
        shr     r8,51
        shl     r9,13
        and     rcx,rbp
        or      r9,r8
        add     rdx,r9

        mov     r10,r14
        shr     r14,51
        shl     r15,13
        and     r10,rbp
        or      r15,r14

        lea     r14,[r15*8+r15]
        lea     r15,[r14*2+r15]
        add     rax,r15

        mov     r8,rdx
        and     rdx,rbp
        shr     r8,51
        add     rbx,r8

        mov     r9,rax
        and     rax,rbp
        shr     r9,51
        add     rcx,r9

        mov     QWORD[rdi],rax
        mov     QWORD[8+rdi],rcx
        mov     QWORD[16+rdi],rdx
        mov     QWORD[24+rdi],rbx
        mov     QWORD[32+rdi],r10

        mov     r15,QWORD[40+rsp]

        mov     r14,QWORD[48+rsp]

        mov     r13,QWORD[56+rsp]

        mov     r12,QWORD[64+rsp]

        mov     rbx,QWORD[72+rsp]

        mov     rbp,QWORD[80+rsp]

        lea     rsp,[88+rsp]

$L$fe51_sqr_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_x25519_fe51_sqr:

global  x25519_fe51_mul121666

ALIGN   32
x25519_fe51_mul121666:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe51_mul121666:
        mov     rdi,rcx
        mov     rsi,rdx



        push    rbp

        push    rbx

        push    r12

        push    r13

        push    r14

        push    r15

        lea     rsp,[((-40))+rsp]

$L$fe51_mul121666_body:
        mov     eax,121666

        mul     QWORD[rsi]
        mov     rbx,rax
        mov     eax,121666
        mov     rcx,rdx
        mul     QWORD[8+rsi]
        mov     r8,rax
        mov     eax,121666
        mov     r9,rdx
        mul     QWORD[16+rsi]
        mov     r10,rax
        mov     eax,121666
        mov     r11,rdx
        mul     QWORD[24+rsi]
        mov     r12,rax
        mov     eax,121666
        mov     r13,rdx
        mul     QWORD[32+rsi]
        mov     r14,rax
        mov     r15,rdx

        jmp     NEAR $L$reduce51
$L$fe51_mul121666_epilogue:

$L$SEH_end_x25519_fe51_mul121666:
EXTERN  OPENSSL_ia32cap_P
global  x25519_fe64_eligible

ALIGN   32
x25519_fe64_eligible:

        mov     ecx,DWORD[((OPENSSL_ia32cap_P+8))]
        xor     eax,eax
        and     ecx,0x80100
        cmp     ecx,0x80100
        cmove   eax,ecx
        DB      0F3h,0C3h               ;repret



global  x25519_fe64_mul

ALIGN   32
x25519_fe64_mul:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe64_mul:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8



        push    rbp

        push    rbx

        push    r12

        push    r13

        push    r14

        push    r15

        push    rdi

        lea     rsp,[((-16))+rsp]

$L$fe64_mul_body:

        mov     rax,rdx
        mov     rbp,QWORD[rdx]
        mov     rdx,QWORD[rsi]
        mov     rcx,QWORD[8+rax]
        mov     r14,QWORD[16+rax]
        mov     r15,QWORD[24+rax]

        mulx    rax,r8,rbp
        xor     edi,edi
        mulx    rbx,r9,rcx
        adcx    r9,rax
        mulx    rax,r10,r14
        adcx    r10,rbx
        mulx    r12,r11,r15
        mov     rdx,QWORD[8+rsi]
        adcx    r11,rax
        mov     QWORD[rsp],r14
        adcx    r12,rdi

        mulx    rbx,rax,rbp
        adox    r9,rax
        adcx    r10,rbx
        mulx    rbx,rax,rcx
        adox    r10,rax
        adcx    r11,rbx
        mulx    rbx,rax,r14
        adox    r11,rax
        adcx    r12,rbx
        mulx    r13,rax,r15
        mov     rdx,QWORD[16+rsi]
        adox    r12,rax
        adcx    r13,rdi
        adox    r13,rdi

        mulx    rbx,rax,rbp
        adcx    r10,rax
        adox    r11,rbx
        mulx    rbx,rax,rcx
        adcx    r11,rax
        adox    r12,rbx
        mulx    rbx,rax,r14
        adcx    r12,rax
        adox    r13,rbx
        mulx    r14,rax,r15
        mov     rdx,QWORD[24+rsi]
        adcx    r13,rax
        adox    r14,rdi
        adcx    r14,rdi

        mulx    rbx,rax,rbp
        adox    r11,rax
        adcx    r12,rbx
        mulx    rbx,rax,rcx
        adox    r12,rax
        adcx    r13,rbx
        mulx    rbx,rax,QWORD[rsp]
        adox    r13,rax
        adcx    r14,rbx
        mulx    r15,rax,r15
        mov     edx,38
        adox    r14,rax
        adcx    r15,rdi
        adox    r15,rdi

        jmp     NEAR $L$reduce64
$L$fe64_mul_epilogue:

$L$SEH_end_x25519_fe64_mul:

global  x25519_fe64_sqr

ALIGN   32
x25519_fe64_sqr:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe64_sqr:
        mov     rdi,rcx
        mov     rsi,rdx



        push    rbp

        push    rbx

        push    r12

        push    r13

        push    r14

        push    r15

        push    rdi

        lea     rsp,[((-16))+rsp]

$L$fe64_sqr_body:

        mov     rdx,QWORD[rsi]
        mov     rcx,QWORD[8+rsi]
        mov     rbp,QWORD[16+rsi]
        mov     rsi,QWORD[24+rsi]


        mulx    r15,r8,rdx
        mulx    rax,r9,rcx
        xor     edi,edi
        mulx    rbx,r10,rbp
        adcx    r10,rax
        mulx    r12,r11,rsi
        mov     rdx,rcx
        adcx    r11,rbx
        adcx    r12,rdi


        mulx    rbx,rax,rbp
        adox    r11,rax
        adcx    r12,rbx
        mulx    r13,rax,rsi
        mov     rdx,rbp
        adox    r12,rax
        adcx    r13,rdi


        mulx    r14,rax,rsi
        mov     rdx,rcx
        adox    r13,rax
        adcx    r14,rdi
        adox    r14,rdi

        adcx    r9,r9
        adox    r9,r15
        adcx    r10,r10
        mulx    rbx,rax,rdx
        mov     rdx,rbp
        adcx    r11,r11
        adox    r10,rax
        adcx    r12,r12
        adox    r11,rbx
        mulx    rbx,rax,rdx
        mov     rdx,rsi
        adcx    r13,r13
        adox    r12,rax
        adcx    r14,r14
        adox    r13,rbx
        mulx    r15,rax,rdx
        mov     edx,38
        adox    r14,rax
        adcx    r15,rdi
        adox    r15,rdi
        jmp     NEAR $L$reduce64

ALIGN   32
$L$reduce64:
        mulx    rbx,rax,r12
        adcx    r8,rax
        adox    r9,rbx
        mulx    rbx,rax,r13
        adcx    r9,rax
        adox    r10,rbx
        mulx    rbx,rax,r14
        adcx    r10,rax
        adox    r11,rbx
        mulx    r12,rax,r15
        adcx    r11,rax
        adox    r12,rdi
        adcx    r12,rdi

        mov     rdi,QWORD[16+rsp]
        imul    r12,rdx

        add     r8,r12
        adc     r9,0
        adc     r10,0
        adc     r11,0

        sbb     rax,rax
        and     rax,38

        add     r8,rax
        mov     QWORD[8+rdi],r9
        mov     QWORD[16+rdi],r10
        mov     QWORD[24+rdi],r11
        mov     QWORD[rdi],r8

        mov     r15,QWORD[24+rsp]

        mov     r14,QWORD[32+rsp]

        mov     r13,QWORD[40+rsp]

        mov     r12,QWORD[48+rsp]

        mov     rbx,QWORD[56+rsp]

        mov     rbp,QWORD[64+rsp]

        lea     rsp,[72+rsp]

$L$fe64_sqr_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_x25519_fe64_sqr:

global  x25519_fe64_mul121666

ALIGN   32
x25519_fe64_mul121666:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe64_mul121666:
        mov     rdi,rcx
        mov     rsi,rdx


$L$fe64_mul121666_body:

        mov     edx,121666
        mulx    rcx,r8,QWORD[rsi]
        mulx    rax,r9,QWORD[8+rsi]
        add     r9,rcx
        mulx    rcx,r10,QWORD[16+rsi]
        adc     r10,rax
        mulx    rax,r11,QWORD[24+rsi]
        adc     r11,rcx
        adc     rax,0

        imul    rax,rax,38

        add     r8,rax
        adc     r9,0
        adc     r10,0
        adc     r11,0

        sbb     rax,rax
        and     rax,38

        add     r8,rax
        mov     QWORD[8+rdi],r9
        mov     QWORD[16+rdi],r10
        mov     QWORD[24+rdi],r11
        mov     QWORD[rdi],r8

$L$fe64_mul121666_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_x25519_fe64_mul121666:

global  x25519_fe64_add

ALIGN   32
x25519_fe64_add:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe64_add:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8


$L$fe64_add_body:

        mov     r8,QWORD[rsi]
        mov     r9,QWORD[8+rsi]
        mov     r10,QWORD[16+rsi]
        mov     r11,QWORD[24+rsi]

        add     r8,QWORD[rdx]
        adc     r9,QWORD[8+rdx]
        adc     r10,QWORD[16+rdx]
        adc     r11,QWORD[24+rdx]

        sbb     rax,rax
        and     rax,38

        add     r8,rax
        adc     r9,0
        adc     r10,0
        mov     QWORD[8+rdi],r9
        adc     r11,0
        mov     QWORD[16+rdi],r10
        sbb     rax,rax
        mov     QWORD[24+rdi],r11
        and     rax,38

        add     r8,rax
        mov     QWORD[rdi],r8

$L$fe64_add_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_x25519_fe64_add:

global  x25519_fe64_sub

ALIGN   32
x25519_fe64_sub:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe64_sub:
        mov     rdi,rcx
        mov     rsi,rdx
        mov     rdx,r8


$L$fe64_sub_body:

        mov     r8,QWORD[rsi]
        mov     r9,QWORD[8+rsi]
        mov     r10,QWORD[16+rsi]
        mov     r11,QWORD[24+rsi]

        sub     r8,QWORD[rdx]
        sbb     r9,QWORD[8+rdx]
        sbb     r10,QWORD[16+rdx]
        sbb     r11,QWORD[24+rdx]

        sbb     rax,rax
        and     rax,38

        sub     r8,rax
        sbb     r9,0
        sbb     r10,0
        mov     QWORD[8+rdi],r9
        sbb     r11,0
        mov     QWORD[16+rdi],r10
        sbb     rax,rax
        mov     QWORD[24+rdi],r11
        and     rax,38

        sub     r8,rax
        mov     QWORD[rdi],r8

$L$fe64_sub_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_x25519_fe64_sub:

global  x25519_fe64_tobytes

ALIGN   32
x25519_fe64_tobytes:
        mov     QWORD[8+rsp],rdi        ;WIN64 prologue
        mov     QWORD[16+rsp],rsi
        mov     rax,rsp
$L$SEH_begin_x25519_fe64_tobytes:
        mov     rdi,rcx
        mov     rsi,rdx


$L$fe64_to_body:

        mov     r8,QWORD[rsi]
        mov     r9,QWORD[8+rsi]
        mov     r10,QWORD[16+rsi]
        mov     r11,QWORD[24+rsi]


        lea     rax,[r11*1+r11]
        sar     r11,63
        shr     rax,1
        and     r11,19
        add     r11,19

        add     r8,r11
        adc     r9,0
        adc     r10,0
        adc     rax,0

        lea     r11,[rax*1+rax]
        sar     rax,63
        shr     r11,1
        not     rax
        and     rax,19

        sub     r8,rax
        sbb     r9,0
        sbb     r10,0
        sbb     r11,0

        mov     QWORD[rdi],r8
        mov     QWORD[8+rdi],r9
        mov     QWORD[16+rdi],r10
        mov     QWORD[24+rdi],r11

$L$fe64_to_epilogue:
        mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
        mov     rsi,QWORD[16+rsp]
        DB      0F3h,0C3h               ;repret

$L$SEH_end_x25519_fe64_tobytes:
DB      88,50,53,53,49,57,32,112,114,105,109,105,116,105,118,101
DB      115,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82
DB      89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
DB      114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
EXTERN  __imp_RtlVirtualUnwind


ALIGN   16
short_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[120+r8]
        mov     rbx,QWORD[248+r8]

        mov     rsi,QWORD[8+r9]
        mov     r11,QWORD[56+r9]

        mov     r10d,DWORD[r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     rax,QWORD[152+r8]
        jmp     NEAR $L$common_seh_tail



ALIGN   16
full_handler:
        push    rsi
        push    rdi
        push    rbx
        push    rbp
        push    r12
        push    r13
        push    r14
        push    r15
        pushfq
        sub     rsp,64

        mov     rax,QWORD[120+r8]
        mov     rbx,QWORD[248+r8]

        mov     rsi,QWORD[8+r9]
        mov     r11,QWORD[56+r9]

        mov     r10d,DWORD[r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jb      NEAR $L$common_seh_tail

        mov     rax,QWORD[152+r8]

        mov     r10d,DWORD[4+r11]
        lea     r10,[r10*1+rsi]
        cmp     rbx,r10
        jae     NEAR $L$common_seh_tail

        mov     r10d,DWORD[8+r11]
        lea     rax,[r10*1+rax]

        mov     rbp,QWORD[((-8))+rax]
        mov     rbx,QWORD[((-16))+rax]
        mov     r12,QWORD[((-24))+rax]
        mov     r13,QWORD[((-32))+rax]
        mov     r14,QWORD[((-40))+rax]
        mov     r15,QWORD[((-48))+rax]
        mov     QWORD[144+r8],rbx
        mov     QWORD[160+r8],rbp
        mov     QWORD[216+r8],r12
        mov     QWORD[224+r8],r13
        mov     QWORD[232+r8],r14
        mov     QWORD[240+r8],r15

$L$common_seh_tail:
        mov     rdi,QWORD[8+rax]
        mov     rsi,QWORD[16+rax]
        mov     QWORD[152+r8],rax
        mov     QWORD[168+r8],rsi
        mov     QWORD[176+r8],rdi

        mov     rdi,QWORD[40+r9]
        mov     rsi,r8
        mov     ecx,154
        DD      0xa548f3fc

        mov     rsi,r9
        xor     rcx,rcx
        mov     rdx,QWORD[8+rsi]
        mov     r8,QWORD[rsi]
        mov     r9,QWORD[16+rsi]
        mov     r10,QWORD[40+rsi]
        lea     r11,[56+rsi]
        lea     r12,[24+rsi]
        mov     QWORD[32+rsp],r10
        mov     QWORD[40+rsp],r11
        mov     QWORD[48+rsp],r12
        mov     QWORD[56+rsp],rcx
        call    QWORD[__imp_RtlVirtualUnwind]

        mov     eax,1
        add     rsp,64
        popfq
        pop     r15
        pop     r14
        pop     r13
        pop     r12
        pop     rbp
        pop     rbx
        pop     rdi
        pop     rsi
        DB      0F3h,0C3h               ;repret


section .pdata rdata align=4
ALIGN   4
        DD      $L$SEH_begin_x25519_fe51_mul wrt ..imagebase
        DD      $L$SEH_end_x25519_fe51_mul wrt ..imagebase
        DD      $L$SEH_info_x25519_fe51_mul wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe51_sqr wrt ..imagebase
        DD      $L$SEH_end_x25519_fe51_sqr wrt ..imagebase
        DD      $L$SEH_info_x25519_fe51_sqr wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe51_mul121666 wrt ..imagebase
        DD      $L$SEH_end_x25519_fe51_mul121666 wrt ..imagebase
        DD      $L$SEH_info_x25519_fe51_mul121666 wrt ..imagebase
        DD      $L$SEH_begin_x25519_fe64_mul wrt ..imagebase
        DD      $L$SEH_end_x25519_fe64_mul wrt ..imagebase
        DD      $L$SEH_info_x25519_fe64_mul wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe64_sqr wrt ..imagebase
        DD      $L$SEH_end_x25519_fe64_sqr wrt ..imagebase
        DD      $L$SEH_info_x25519_fe64_sqr wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe64_mul121666 wrt ..imagebase
        DD      $L$SEH_end_x25519_fe64_mul121666 wrt ..imagebase
        DD      $L$SEH_info_x25519_fe64_mul121666 wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe64_add wrt ..imagebase
        DD      $L$SEH_end_x25519_fe64_add wrt ..imagebase
        DD      $L$SEH_info_x25519_fe64_add wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe64_sub wrt ..imagebase
        DD      $L$SEH_end_x25519_fe64_sub wrt ..imagebase
        DD      $L$SEH_info_x25519_fe64_sub wrt ..imagebase

        DD      $L$SEH_begin_x25519_fe64_tobytes wrt ..imagebase
        DD      $L$SEH_end_x25519_fe64_tobytes wrt ..imagebase
        DD      $L$SEH_info_x25519_fe64_tobytes wrt ..imagebase
section .xdata rdata align=8
ALIGN   8
$L$SEH_info_x25519_fe51_mul:
DB      9,0,0,0
        DD      full_handler wrt ..imagebase
        DD      $L$fe51_mul_body wrt ..imagebase,$L$fe51_mul_epilogue wrt ..imagebase
        DD      88,0
$L$SEH_info_x25519_fe51_sqr:
DB      9,0,0,0
        DD      full_handler wrt ..imagebase
        DD      $L$fe51_sqr_body wrt ..imagebase,$L$fe51_sqr_epilogue wrt ..imagebase
        DD      88,0
$L$SEH_info_x25519_fe51_mul121666:
DB      9,0,0,0
        DD      full_handler wrt ..imagebase
        DD      $L$fe51_mul121666_body wrt ..imagebase,$L$fe51_mul121666_epilogue wrt ..imagebase
        DD      88,0
$L$SEH_info_x25519_fe64_mul:
DB      9,0,0,0
        DD      full_handler wrt ..imagebase
        DD      $L$fe64_mul_body wrt ..imagebase,$L$fe64_mul_epilogue wrt ..imagebase
        DD      72,0
$L$SEH_info_x25519_fe64_sqr:
DB      9,0,0,0
        DD      full_handler wrt ..imagebase
        DD      $L$fe64_sqr_body wrt ..imagebase,$L$fe64_sqr_epilogue wrt ..imagebase
        DD      72,0
$L$SEH_info_x25519_fe64_mul121666:
DB      9,0,0,0
        DD      short_handler wrt ..imagebase
        DD      $L$fe64_mul121666_body wrt ..imagebase,$L$fe64_mul121666_epilogue wrt ..imagebase
$L$SEH_info_x25519_fe64_add:
DB      9,0,0,0
        DD      short_handler wrt ..imagebase
        DD      $L$fe64_add_body wrt ..imagebase,$L$fe64_add_epilogue wrt ..imagebase
$L$SEH_info_x25519_fe64_sub:
DB      9,0,0,0
        DD      short_handler wrt ..imagebase
        DD      $L$fe64_sub_body wrt ..imagebase,$L$fe64_sub_epilogue wrt ..imagebase
$L$SEH_info_x25519_fe64_tobytes:
DB      9,0,0,0
        DD      short_handler wrt ..imagebase
        DD      $L$fe64_to_body wrt ..imagebase,$L$fe64_to_epilogue wrt ..imagebase
